package com.arpa.wms.mapper;

import com.arpa.wms.domain.dto.InventoryDTO;
import com.arpa.wms.domain.dto.InventoryOperationDto;
import com.arpa.wms.domain.dto.inventory.InventoryYdkwDto;
import com.arpa.wms.domain.entity.Inventory;
import com.arpa.wms.domain.entity.PickingItem;
import com.arpa.wms.domain.vo.InventoryImportVO;
import com.arpa.wms.domain.vo.InventoryVO;
import com.arpa.wms.domain.vo.InventoryWithDistributionVO;
import com.arpa.wms.domain.vo.UsefulInventoryVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 库存 Mapper 接口
 * </p>
 *
 * @author LEO
 * @since 2020-08-04
 */
public interface InventoryMapper extends BaseMapper<Inventory> {

    /**
     * 查询列表
     * @param inventoryDTO
     * @return
     */
    List<InventoryVO> queryList(InventoryDTO inventoryDTO);

    /**
     * 查询汇总数量
     * @param inventoryDTO
     * @return
     */
    InventoryVO querySumQuantity(InventoryDTO inventoryDTO);

     /**
      *  @author: Allen chen
      *  @Date: 2020/9/30 9:24
      *  @Description: 根据库存状态查询库存列表
      */
    List<InventoryVO> queryByInventoryStatus(List<String> list,@Param("groupCode") String groupCode);

     /**
      *  @author: Allen chen
      *  @Date: 2020/9/3 18:34
      *  @Description: 根据code查询库存信息，（没有其他条件限制）
      */
    List<InventoryVO> queryInventoryByCodes(List<String> list);
     /**
      *  @author: Allen chen
      *  @Date: 2020/8/25 13:56
      *  @Description: 根据商品查询仓库信息
      */
     List<InventoryVO> queryInventoryByGoodsCode(InventoryDTO inventoryDTO);

    /**
     * 查询合计,包含总数
     * @param inventoryDTO
     * @return
     */
    InventoryVO queryListSum(InventoryDTO inventoryDTO);

    /**
     * 根据条件查询库存总量
     * @param inventoryDTO
     * @return
     */
    BigDecimal queryInventorySum(InventoryDTO inventoryDTO);

    /**
     * 根据拣货单更新库存数量
     * @param pickingItem
     */
    void updateQuantity(PickingItem pickingItem);

    /**
     * 批次调整时调整库存数量
     * @param adjustInventory
     * @return
     */
    int adjustQuantity(InventoryDTO adjustInventory);

    /**
     * 查询可移位库存（非占用库存都可操作）
     * @param inventoryDTO
     * @return
     */
    List<InventoryVO> queryCanMoveList(InventoryDTO inventoryDTO);

    InventoryVO queryCanMoveListSum(InventoryDTO inventoryDTO);

    List<InventoryWithDistributionVO> queryCanDistributeInventory(@Param("warehouseCode") String warehouseCode, @Param("shipmentCode") String shipmentCode, @Param("goodsCode") String goodsCode,@Param("groupCode") String groupCode);

    /**
     * 调整占用库存数量
     * @param inventoryDTO
     * @return
     */
    int adjustUseQuantity(InventoryDTO inventoryDTO);

    /**
     * 查询可以自动分配的库存
     * @param inventoryDTO
     * @return
     */
    List<UsefulInventoryVO> getCanAutoDistributedInventory(InventoryDTO inventoryDTO);


    /**
     * 获取仓库库存
     * @param warehouseCodes 仓库code
     * @return  Map.key="quatity","warehouseCode"
     */
    List<Map<String,Object>> getQuantity(@Param("warehouseCodes") List<String> warehouseCodes,@Param("groupCode") String groupCode);


    /**
     * 库存存储托盘数量
     *
     * @param code 库位code
     * @return
     */
    Integer countPallet(@Param("code") String code);

     /**
      *  @author: Allen chen
      *  @Date: 2020/10/28 14:18
      *  @Description: 条件查询 （不带分页）
      */
    List<InventoryVO> queryByCondition(InventoryDTO inventoryDTO);

    /**
     * 计算不可用库存数量；不可用库存是指库存状态为不可发货的库存；
     * @param inventoryDTO
     * @return
     */
    BigDecimal countUnusableInv(InventoryDTO inventoryDTO);

    /**
     * 根据货主、库存状态值获取不可用库存信息，包括仓库、商品、不可用数量；用于更新oms不可用库存数量
     * @param inventoryDTO
     * @return
     */
    List<InventoryVO> getContUseQuantityInfo(InventoryDTO inventoryDTO);

    /**
     * 执行原生sql
     * @param sql
     */
    void execSql(@Param("sql") String sql);

    /**
     * 操作减库存
     * @author liuxr
     * @date 2021/5/12 10:32
     * @param code 待减库存标识
     * @param quantity 减少数量
     */
    int subtractInventory(@Param("code") String code, @Param("quantity") BigDecimal quantity);

    /**
     * 操作新建库存
     * @author liuxr
     * @date 2021/5/12 10:32
     * @param code
     * @param quantity
     */
    int insertInventory(@Param("code") String code, @Param("quantity") BigDecimal quantity);

    /**
     * 操作加库存
     * @author liuxr
     * @date 2021/5/12 10:32
     * @param code
     * @param quantity
     */
    int addInventory(@Param("code") String code, @Param("quantity") BigDecimal quantity);

    /**
     * 批量操作减库存
     * @author liuxr
     * @date 2021/5/17 19:55
     * @param opData
     * @return int
     */
    int subtractInventoryBatch(List<InventoryOperationDto> opData);
    /**
     * 批量操作加库存
     * @author liuxr
     * @date 2021/5/17 19:55
     * @param opData
     * @return int
     */
    int addInventoryBatch(List<InventoryOperationDto> opData);

    /**
     * 批量调整占用库存
     * @author rfwang
     * @date 2021/12/10 19:22
     * @param opData
     * @return int
     */
    int adjustUsedQuantityBatch(List<InventoryOperationDto> opData);

    /**
     * 获取推荐库位
     * @param inventoryDTO
     */
    List<InventoryVO> getRecommondLocations(InventoryDTO inventoryDTO);




    /**
     * 待返架库存分页 总数
     * @param dto
     * @return
     */
    InventoryVO queryBackRackListSum(InventoryDTO dto);

    /**
     * 待返架库存分页数据
     * @param inventoryDTO
     * @return
     */
    List<InventoryVO> queryBackRackList(InventoryDTO inventoryDTO);

    /**
     * 库存导出数据
     * @param inventoryDTO
     * @return
     */
    List<InventoryImportVO> importInventory(InventoryDTO inventoryDTO);

    /**
     * 查询导入单合计,包含总数
     * @param inventoryDTO
     * @return
     */
    InventoryImportVO importInventorySum(InventoryDTO inventoryDTO);
}
